/*https://leetcode.cn/problems/maximum-total-damage-with-spell-casting/submissions/567075013/*/
class Solution {
public:
    long long maximumTotalDamage(vector<int>& power) {
        sort(power.begin(),power.end());
        unordered_map<int,int> cnt;
        for(int p : power)cnt[p]++;//统计伤害值的出现次数，记入哈希表中
        vector<pair<int,int>> pc(cnt.begin(),cnt.end());//将 cnt 中的键值对转换为 vector<pair<int,int>>（pc），其中每个元素是一个 pair，包含伤害值及其出现次数。
        ranges::sort(pc);//对整个范围进行排序的便捷方式
        int n = pc.size();
        vector<long long>dp(n+1);//表示在i的位置，最大的伤害值
        
        for(int i = 0,j = 0;i < n;i++){
            auto& [p,c] = pc[i];
            while(pc[j].first < p-2)j++;
            dp[i+1] = max(dp[i],dp[j]+(long long)p * c);
        }
    return dp[n];
    }
};